package lanxing.future.base.chapter18;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

import javax.management.RuntimeErrorException;

/**
 * @author <a href="mailto:lanxing@chances.com.cn">lanxing</a>
 * @version 2019年5月21日
 *
 */
public class LockPartFiles {
    static final int LENGTH = 0x12;

    static FileChannel fc;

    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {
        fc = new RandomAccessFile("testData3.txt", "rw").getChannel();
        
        MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
        
        for(int i = 0;i<LENGTH ;i++) {
            out.put((byte)'x');
        }
        
        new  LockAndModify(out,0,0+LENGTH/3);
        //new LockAndModify(out,LENGTH/2,LENGTH/2+ LENGTH/4);
    }
    
    
    private static class LockAndModify extends Thread {
        private ByteBuffer buff;
        
        private int start,end;
        
        /**
         * 
         */
        public LockAndModify(ByteBuffer mbb,int start,int end) {
            this.start = start;
            
            this.end = end;
            
            mbb.limit(end);
            mbb.position(start);
            
            buff = mbb.slice();
            
            start();
        }
        
        public void run() {
           try {
            FileLock fl = fc.lock(start, end, false);
            System.out.println("locked start:"+start+",end:"+end);
            
            while(buff.position() < buff.limit()-1) {
                //buff.put((byte)(buff.get()+1));
                System.out.println(buff.get());
            }
            
            fl.release();
            System.out.println("releaseed "+start+" to " +end);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
           
        }
        
        
        
    }
    
}
